package edu.ustb.efws.utils;

import java.time.*;
import java.util.Date;

/**
 * 日期工具类
 *
 * @author TS Group
 */
public class DateUtils {

    /**
     * 转换成{@link LocalDate}
     *
     * @param time {@link Date}
     * @return {@link LocalDate}
     */
    public static LocalDate toLocalDate(Date time){
        ZoneId zoneId = ZoneId.systemDefault();
        return LocalDateTime.ofInstant(time.toInstant(), zoneId).toLocalDate();
    }

    /**
     * 转换成Date
     *
     * @param localDate {@link LocalDate}
     * @return {@link Date}
     */
    public static Date toDate(LocalDate localDate){
        ZoneId zoneId = ZoneId.systemDefault();
        LocalTime time = LocalTime.of(0, 0);
        ZonedDateTime zdt = LocalDateTime.of(localDate, time).atZone(zoneId);
        return Date.from(zdt.toInstant());
    }

    /**
     * 转换成{@link Instant}
     *
     * @param localDate {@link LocalDate}
     * @return {@link Date}
     */
    public static Instant toInstant(LocalDate localDate){
        ZoneId zoneId = ZoneId.systemDefault();
        LocalTime time = LocalTime.of(0, 0);
        ZonedDateTime zdt = LocalDateTime.of(localDate, time).atZone(zoneId);
        return zdt.toInstant();
    }

    /**
     * 获取当前时间月份格式(yyyyMM)
     *
     * @param time 时间
     * @return 月份数字(yyyyMM)
     */
    public static int dateToMonthNum(Date time){
        ZoneId zoneId = ZoneId.systemDefault();
        LocalDateTime localDateTime = LocalDateTime.ofInstant(time.toInstant(), zoneId);
        return localDateTime.getYear() * 100 + localDateTime.getMonthValue();
    }

    /**
     * 获取当前时间月份格式(yyyyMM)
     *
     * @param time 时间
     * @return 月份数字(yyyyMM)
     */
    public static int todayMonthNum(){
        LocalDate now = LocalDate.now();
        return now.getYear() * 100 + now.getMonthValue();
    }

    /**
     * 转换成LocalDateTime
     *
     * @param time {@link Date}
     * @return LocalDateTime
     */
    public static LocalDateTime dateToLocalDataTime(Date time){
        ZoneId zoneId = ZoneId.systemDefault();
        return LocalDateTime.ofInstant(time.toInstant(), zoneId);
    }

    /**
     * 获取当前时间月份格式(yyyyMM)
     *
     * @param localDate {@link LocalDate}
     * @return 月份数字(yyyyMM)
     */
    public static int localDateToMonthNum(LocalDate localDate){
        return localDate.getYear() * 100 + localDate.getMonthValue();
    }

    /**
     * 月份转换成{@link LocalDate}
     *
     * @param monthNum 月份数字(yyyyMM)
     * @return {@link LocalDate}
     */
    public static LocalDate monthNumToLocalData(int monthNum){
        int y = monthNum / 100;
        int m = monthNum % 100;
        return LocalDate.of(y, m, 1);
    }
}
